import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;


public class clustering {
	static List<Cluster> clusters=new ArrayList<Cluster>();
	static List<clasificacion>clasif;
	static int nivel=10;
	static String bd="ia_database";
    static String login="usuario";
    static String pass="1234";
    static String url="jdbc:mysql://localhost:3306/"+bd;
	
	public static void main(String[] args) {
		
		ConexionMySQL.Conectar(bd,login,pass,url);
		clusters=Rita.ConstruirClusters();
		for(int i=0;i<clusters.size();i++)
			System.out.println(clusters.get(i).getIds().toString()+" "+clusters.get(i).getHiperonimos().toString());
		
		for(int j=1;j<=nivel;j++){
			System.out.println("\n_______________________________________________________________________________________________________________________________________________________________");
			System.out.println("Nivel "+j);
			System.out.println("\nSimilitudes:");
			cluster();
			System.out.println("\nClusters:");
			for(int i=0;i<clusters.size();i++)
				System.out.println(clusters.get(i).getIds().toString());
//				System.out.println(clusters.get(i).getIds().toString()+" "+clusters.get(i).getHiperonimos().toString());

		}
	}

	private static void cluster() {
		double maximo=clasificacion();
		
		List<clasificacion> mas_altos=new ArrayList<clasificacion>();
		for(int i=0;i<clasif.size();i++)
			if(clasif.get(i).getSimilitud()==maximo)
				mas_altos.add(clasif.get(i));
		
		List<clasificacion> mas_altos_new=new ArrayList<clasificacion>();
		mas_altos_new.addAll(mas_altos);
		
		for(int i=0;i<mas_altos.size();i++)
			for(int j=i+1;j<mas_altos.size();j++)
				if(esIgual(mas_altos.get(i),mas_altos.get(j)))	mas_altos_new.remove(mas_altos.get(j));

		for(int i=0;i<mas_altos_new.size();i++){
			Cluster C=interseccion(mas_altos_new.get(i).getA(),mas_altos_new.get(i).getB());
			clusters.remove(mas_altos_new.get(i).getA());
			clusters.remove(mas_altos_new.get(i).getB());
			clusters.add(C);
		}
	}

	private static boolean esIgual(clasificacion clasificacion,clasificacion clasificacion2) {
		boolean esigual=false;
		Cluster A1=clasificacion.getA();
		Cluster A2=clasificacion.getB();
		Cluster B1=clasificacion2.getA();
		Cluster B2=clasificacion2.getB();
		if(A1.getIds().containsAll(B1.getIds())||A1.getIds().containsAll(B2.getIds())||A2.getIds().containsAll(B1.getIds())||A2.getIds().containsAll(B2.getIds()))
			esigual=true;		
		return esigual;
	}

	public static double similitud(Cluster A, Cluster B){
		double coincidencias=0;
		for(int i=0; i<A.getHiperonimos().size();i++){
			if(B.getHiperonimos().contains(A.getHiperonimos().get(i)))coincidencias+=1;
		}	
		if(A.getHiperonimos().size()>B.getHiperonimos().size())
			coincidencias=coincidencias/A.getHiperonimos().size();
		else coincidencias=coincidencias/B.getHiperonimos().size();
		
		System.out.println("Cluster A "+A.getIds().toString()+" Cluster B "+B.getIds().toString()+" similitud "+coincidencias);
		return coincidencias;
	}
	
	public static Cluster interseccion(Cluster A, Cluster B){
		List<Integer> ides=A.getIds();
		for(int i=0;i<B.getIds().size();i++) ides.add(B.getIds().get(i));
		List<String> hiperonims=new ArrayList<String>();
		for(int i=0; i<A.getHiperonimos().size();i++){
			if(B.getHiperonimos().contains(A.getHiperonimos().get(i)))
				hiperonims.add(A.getHiperonimos().get(i));
		}
		Cluster C=new Cluster(ides,hiperonims);
		return C;				
	}
	
	public static double clasificacion(){
		double maximo=0;
		clasif=new ArrayList<clasificacion>();
		for(int i=0;i<clusters.size();i++){
			for(int j=i+1;j<clusters.size();j++){
					double similitud=similitud(clusters.get(i),clusters.get(j));
					clasificacion clas=new clasificacion(clusters.get(i),clusters.get(j),similitud);
					clasif.add(clas);
					if(similitud>maximo) maximo=similitud;
			}			
		}
		return maximo;
	}


}
